Інформація про новину
  • Переглядів: 4123
  • Дата: 8-05-2020, 19:40
8-05-2020, 19:40

Створення анімації за допомогою Phyton

Категорія: Інформатика





Попередня сторінка:  Графічні методи модуля tkinter
Наступна сторінка:   Поштові служби інтернету

В усіх програмах із використанням графіки ми часто бачимо ефекти анімації . Анімація — це ілюзія руху об’єктів, яка досягається шляхом швидкої зміни зображень на екрані .

Кожна із зображених на полотні фігур (див . § 10) є окремим об’єктом, і завдяки цьому можна програмувати їх рух і взаємодію.

Рух графічних об'єктів

Розглянемо методи, що знадобляться для переміщення об’єкта полотном .

• Метод canvas.move переміщає графічний об’єкт, змінюючи значення його координат на задані величини: canvas.move(item, x, y),

де item — ідентифікатор графічного об’єкта (створюється автоматично під час створення графічного об’єкта); x, у — значення зміщення по горизонталі та вертикалі (у пікселях) .

• Метод update() примусово оновлює зображення.

• Метод time.sleep() затримує виконання програми: time.sleep(t),

де t - величина затримки (в секундах) .

Організуємо горизонтальний рух круга по полотну. Перший створений об’єкт (круг) автоматично отримує ідентифікатор 1:

Блок коду в циклі for призначено для пересування круга по полотну. Зокрема, команда canvas.move(1, 5, 0) пересуне об’єкт із ідентифікатором 1 (це і є круг) на 5 пікселів праворуч і 0 пікселів по вертикалі .

Для пересування ліворуч знадобилася б команда canvas.move(1, -5, 0) . Для руху по діагоналі слід змінювати одночасно координати х і у: canvas.move(1, 5, 5)

Програмування реакції об’єктів на події

Можна зробити так, щоб об’єкт рухався у відповідь на подію, що відбувається під час роботи програми — пересування миші, натискання зазначеної клавіші . Для обробки події потрібно описати функцію, а потім повідомити tkinter, що ця функція має викликатися кожного разу, коли відбудеться зазначена подія Для встановлення зв’язку між подією та її обробником існує метод bind_all():

Функція має єдиний аргумент event, через який передається інформація про подію . Об’єкт event має властивість keysym, яка набуває значення відповідної клавіші . Якщо натиснуто клавішу «^-», це означає, що відбулася подія <KeyPress-Right>', і властивість event.keysym отримує значення 'Right' (рис . 11.1) .

Буде цікавіше змінювати напрямок руху круга, застосовуючи всі чотири клавіші зі стрілками. В тілі функції move_oval() запрограмуємо зміну координат об’єкта залежно від того, яке значення передане для аргумента event:

У функції move_oval() перевіряється, чи містить змінна keysym значення 'Up'. Якщо так, викликається метод canvas.move(1, 0, -3), і круг зміщується вгору. Якщо ні, перевіряється, чи містить змінна keysym значення 'Down', і, якщо так, робиться крок униз. Так само опрацьовується значення 'Left'. Якщо жодна з трьох умов не виконалася, круг зміщується праворуч . Таким чином, при натисканні на клавішу об’єкт пересувається в заданому напрямку

Далі повідомимо tkinter, що функцію move_oval() треба застосовувати для обробки чотирьох подій: натискань клавіш «вгору», «вниз», «ліворуч» і «праворуч»:

Створення анімації з використанням графічних файлів

У мультфільмах ілюзія руху об’єктів створюється за рахунок послідовної зміни кадрів, кожний із яких фіксує чергову фазу руху об’єкта

Використовуючи цей принцип, ми можемо запрограмувати рух об’єктів на полотні . Спочатку потрібно підготувати певну кількість графічних файлів, які містять зображення фаз руху деякого об’єкта Потім запрограмувати послідовне завантаження на полотно зображень із цих файлів . Між завантаженнями слід затримати виконання програми для того, щоб користувач встиг побачити чергове зображення .

Створимо анімацію Політ метелика із трьох кадрів . Розглянемо кроки створення анімації.

1 . Підготуємо три графічних файли з зображеннями фаз руху метелика (рис . 11.2) . Імена цих файлів зберігатимуться у списку anim (див . програму) .

2 . Запишемо програмний код:

Проаналізуємо опис функції play(), що призначена для організації зміни зображень . В циклі for почергово викликом методу create_image створюється зображення на основі графічних даних чергового кадра зі списку frames .

Метод time.sleep(0.1) виконує затримку зображення на 0.1 секунди . Метод root.after викликається для об’єкта root з аргументами: 0 мс; play, тобто зразу ж після завершення функція play() буде викликана повторно, і зміна зображень продовжиться .

3 . Зберігаємо файл з програмним кодом і виконуємо програму. Отже, засоби бібліотеки tkinter дозволяють створювати програми з анімаційними ефектами, а також додавати реакцію на дії користувача шляхом програмування обробки подій .

Питання для самоперевірки

1. Які функції використовуються для переміщення об’єкта по полотну?

2. Як запрограмувати реакцію об’єкта на подію?

3. Поясніть призначення параметрів функції:

4. Опишіть кроки створення анімації шляхом послідовної зміни зображень

5. Як зміниться Політ метелика (див . приклад 4), якщо з коду вилучити виклик методу time.sleep(0.1)?

6. Створіть програму, в якій по зоряному небу рухається космічний зонд Кассіні (рис. 11.3) .

Вправа її

Створити програму, в якій реалізовано рух кульки по полотну. Об’єкт має змінювати положення у відповідь на натискання клавіш управління курсором, залишаючи слід на полотні (рис . 11.4) .

2) Намалюйте у лівому верхньому куті червоний круг. Ідентифікатор створеного круга зберігатиметься в змінній ball: ball = canvas.create_oval(10, 10, 30, 30, fill = 'red') Слід кульки утворюватимуть відрізки, що сполучають центри послідовних положень круга

3) Для обчислення координат центра круга (рис . 11.5) опишіть функцію midpoint:

4) Опишіть функцію move_oval() . У ній будуть змінюватися координати круга залежно від того, яку клавішу натиснуто (параметр event), а також малюватиметься відрізок між центрами круга в початковому і кінцевому положеннях:

5) Запишіть виклики функції canvas.bind_all для встановлення зв’язку між подіями «натискання на клавішу зі стрілкою і функцією move_oval:

Збережіть файл з іменем Vprava11 і випробуйте програму.

6) Удоскональте програму: змініть товщину і колір сліду, який залишає круг; додайте діагональні переміщення за допомогою клавіш A, S, Z, X .

Комп’ютерне тестування

Виконайте тестове завдання 11 із автоматичною перевіркою результату

§ 12.

Об'єктно-орієнтоване програмування

Як ви знаєте, мова Python є об’єктно-орієнтованою, тобто кожна величина є об’єктом певного класу. Добре спроектовані об’єкти — це «будівельні блоки», з яких легше будувати складні програми .

Опис класів та створення об'єктів

У 6 класі ви дізналися, як створити свій власний клас (тип) об’єктів . Опис класу розташовується на початку коду програми . Синтаксис опису класу:

Метод__init__називається конструктором класу. Він автоматично

виконується під час створення кожного нового екземпляра на основі даного класу. Ім’я методу починається й закінчується двома символами підкреслення . У списку атрибутів (властивостей) класу першим має бути параметр self, він потрібен для зв’язку з конкретним об’єктом .

Можна вважати, що клас — це своєрідна інструкція зі створення екземплярів . Створення об’єкта на основі класу називають створенням екземпляра класу

Синтаксис команди створення об’єкта такий:

змінна = Ім'я_класу(перелік значень атрибутів)

Далі в програмі з’являється об’єкт, доступ до якого можна отримати за іменем змінної. Об’єкт отримує атрибути його класу.

Атрибути класу — це імена змінних, у яких зберігаються значення властивостей об’єктів

Опишемо клас Balloons, який представляє повітряні кульки . Створимо об’єкт balloon — червону кульку висотою 10 см (рис . 12.1) .

Значення атрибутів об’єкта можна вивести на екран: print (balloon.inflated)

Можна змінити значення атрибута: balloon.color = 'green'

Значення атрибута можна присвоювати змінним: mycolor = balloon.color

Опишемо клас Ball, який представляє кола заданого радіуса, кольору і розташування на полотні . Створимо два екземпляри класу:

Створимо список із 10 об’єктів класу Ball із випадковими координатами і кольорами, що вибираються зі списку colors (рис . 12 . 2) .

Методи класу

Методи — це дії, які можуть виконувати об’єкти даного класу. Методи можуть змінювати властивості (значення атрибутів) об’єкта, виконувати інші дії над об’єктами . Змінюючи атрибути, пов’язані з екземпляром класу, ми можемо змінювати стан об’єктів у програмі .

Синтаксис заголовка методу класу:

def ім'я_методу^еії):

Замість параметра self у разі виклику методу підставляється ім’я конкретного об’єкта

Від звичайної функції метод класу відрізняється наявністю параметра self, опис методу класу розташовується в описі класу.

Виклик методу для конкретного об’єкта в основному блоці програми має вигляд: об'єкт.ім'я_методу(...) .

У разі виклику методу класу до нього автоматично передається змінна екземпляра — інформація про об’єкт, який викликає метод

Додамо до опису класу Balloons метод boom(), який виконується, якщо кулька лопнула (рис . 12.3) .

Принципи об’єктно-орієнтованого програмування

Поняття класу та об’єкта є основою об’єктно-орієнтованого програмування (ООП) . Програма створюється як деяка сукупність об’єктів, які взаємодіють між собою. ООП базується на трьох основних принципах: інкапсуляція, успадкування та поліморфізм Розглянемо сутність цих принципів .

Ви вже знаєте, що списки дозволяють об’єднувати дані, а для об’єднання фрагментів коду в окремий блок застосовуються функції. Об’єкти ж дозволяють об’єднувати функції (методи класу) і дані (значення атрибутів) (рис . 12.4) .

Інкапсуляція — це об’єднання в межах класу певних даних і методів для роботи з ними. Наприклад, ми описали клас Balloons, що представляє повітряні кульки і містить дані про кульку (колір, висота, «надутість»), і методи (змінити значення атрибутів в разі проколювання кульки, збільшити розміри кульки тощо) . При цьому клас стає новим типом даних у програмі, і ми можемо створювати об’єкти — змінні цього нового типу.

Успадкування — це можливість створення нового класу (нащадка) на базі наявного (базового)

Розглянемо такі поняття, як «людина», «учень» . Будь-яка людина має ім’я, прізвище, вік, інші загальні характеристики. Учень також має ім’я, прізвище, вік, але, крім цього, він має додаткові характеристики: навчальний заклад, клас .

З точки зору наслідування клас Учень є нащадком класу Людина . Таким чином, клас-нащадок містить ті самі атрибути й методи, що й базовий клас . Але при цьому його можна розширити через додавання нових методів і атрибутів . Це позбавляє необхідності починати створення класу-нащадка «з нуля» — описувати атрибути й методи, успадковані від базового класу

На основі базового класу Animal (тварина) створимо два класи-на-щадки: Dog (собака) і Cat (кіт), які мають власні методи .

Поліморфізм — це різна поведінка методу в різних класах. Методи з однаковим іменем, описані в різних класах, можуть виконувати різні дії.

Опишемо класи Triangle (прямокутний трикутник) і Square (квадрат) . Додати до описів класів метод для обчислення площі фігури .

Додамо метод voice (голос) до класів Dog і Cat (див . приклад 5) .

Питання для самоперевірки

1. У чому різниця між класом і його екземпляром?

2. Якими атрибутами ви б описали об’єкт Автомобіль, якщо моделюється: а) робота автосалону; б) автоперегони?

3. Проаналізуйте фрагмент програмного коду. Які принципи ООП використано під час складання цього коду?

4. Опишіть клас Car(), що містить атрибути кількість пального в баку на даний момент, пройдений шлях. Додайте до опису класу Car() метод для зміни значення пробігу

Вправа 12

Запрограмувати рух об’єктів класу Ball (М'яч) по вертикалі з відбиттям від меж вікна

У Python IDLE виберіть команду File ^ New File.

1) Імпортуйте необхідні модулі: from tkinter import*

from random import* from time import*

2) Створіть вікно програми і додайте полотно розміром 500 х 400.

3) Створіть клас Ball() з атрибутами x, у (координати правого верхнього кута квадрата, в який уписано круг) і color (колір кульки) .

4) Додайте до опису класу Ball метод, який буде перевіряти, чи дійшов об’єкт до межі вікна, і змінювати напрямок руху.

5) Створіть список із 10 об’єктів класу Ball із випадковими координатами:

6) У нескінченному циклі організуйте виклик методу ruh() для кожного елемента списку list_ball і виклик методу canvas.move() із новими координатами

Збережіть програмний код у файлі з іменем Vprava12 і виконайте програму. Поекспериментуйте зі значеннями величин зміни координати y, радіуса круга

Комп’ютерне тестування

Виконайте тестове завдання 12 із автоматичною перевіркою результату

Практична робота з

Моделювання руху об'єктів

Завдання: скласти ігрову програму Ловець бульбашок . На ігровому полотні кожні 0,2 с виникають бульбашки (див . рисунок) . Гравець знищує бульбашки, клацаючи їх . Якщо кількість бульбашок у вікні перевищує 30, гра припиняється .

Обладнання: комп’ютер зі встановленим середовищем програмування Python .

Хід роботи

Під час роботи з комп’ютером дотримуйтеся правил безпеки.

У Python IDLE виберіть команду File ^ New File .

1. Завантажте модулі, потрібні для реалізації руху об’єктів . Створіть вікно програми і додайте полотно розміром 800 х 500:

2. Створіть глобальну змінну num — лічильник «упійманих» бульбашок:

num = 0

3. Створіть клас Bub() з атрибутами id (автоматично створюваний ідентифікатор об’єкта), r (радіус бульбашки), dx, dy (величини зміщень за осями під час руху)

4. Створіть порожній список об’єктів класу Ball(): my_bub = list[]

5. Опишіть функцію create_bubble(), в тілі якої випадково задаються координати й радіус бульбашки . Ідентифікатор створеного кола зберігається в змінній id1.

Змінні dx, dy отримують випадкові значення з проміжку [-2; 1], що задає напрямок хаотичного руху бульбашки . Додайте об’єкт id1 до списку my_bub

6. Опишіть функцію move_bubble(): кожен об’єкт зі списку my_bub змінює координати на свої значення dx, dy:

•7. Опишіть функцію get_coords(id_num), у якій визначаються координати центра круга (див . рис . 11.5):

8. Опишіть функцію clean_up_bubs(), у якій для кожного елемента списку перевіряється, чи не виходить він за межі вікна. Якщо виходить, відбувається зміна знака dx і/або dy:

9. Опишіть функцію click(event) для обробки події клацання об’єкта . Коли відбувається ця подія, бульбашка вилучається з вікна, і об’єкт із відповідним ідентифікатором вилучається зі списку. Значення лічильника num збільшується на 1 і виводиться у заголовок вікна

10. Після описів усіх функцій в основній програмі запишіть виклик методу canvas.bind() для встановлення зв’язку між подією клацання об’єкта та функцією click:

11. Організуйте перегляд всього списку і виклик методів move_ bubbles(), clean_up_bubs() для кожного елемента списку, поки довжина списку об’єктів не досягне 30.

12. Змініть періодичність виникнення кульок .

Додайте до кульок заливку.

Збережіть програмний код у файлі з іменем ПрактичнаЗ і випробуйте програму

Зробіть висновок: чому для моделювання руху графічних об’єктів доречно використовувати методи ООП.

 

 

Це матеріал з підручника Інформатика за 7 клас Бондаренко

 




Попередня сторінка:  Графічні методи модуля tkinter
Наступна сторінка:   Поштові служби інтернету



^